package com.zjsru.plan2024.codeBase.fifty;

import java.util.HashMap;
import java.util.Map;
import java.util.Objects;

/**
 * 657. 机器人能否返回原点
 * @Author: cookLee
 * @Date: 2024-07-09
 */
public class JudgeCircle {

    /**
     * 主
     * \
     * 输入: moves = "UD"
     * 输出: true
     * 解释：机器人向上移动一次，然后向下移动一次。所有动作都具有相同的幅度，因此它最终回到它开始的原点。因此，我们返回 true。
     * \
     * 输入: moves = "LL"
     * 输出: false
     * 解释：机器人向左移动两次。它最终位于原点的左侧，距原点有两次 “移动” 的距离。我们返回 false，因为它在移动结束时没有返回原点。
     * \
     * @param args args
     */
    public static void main(String[] args) {
        JudgeCircle judgeCircle = new JudgeCircle();
        String moves = "UD";
        System.out.println(judgeCircle.judgeCircle(moves));
    }

    /**
     * 模拟:哈希
     *
     * @param moves 移动
     * @return boolean
     */
    public boolean judgeCircle(String moves) {
        Map<Character, Integer> map = new HashMap<>();
        for (int i = 0; i < moves.length(); i++) {
            map.put(moves.charAt(i), map.getOrDefault(moves.charAt(i), 0) + 1);
        }
        int update = Objects.isNull(map.get('U')) ? 0 : map.get('U');
        int right = Objects.isNull(map.get('R')) ? 0 : map.get('R');
        int left = Objects.isNull(map.get('L')) ? 0 : map.get('L');
        int down = Objects.isNull(map.get('D')) ? 0 : map.get('D');
        return update == down && right == left;
    }

    /**
     * 数组
     *
     * @param moves 移动
     * @return boolean
     */
    public boolean judgeCircle2(String moves) {
        int[] record = new int[21];
        for (char c : moves.toCharArray()) {
            record[c - 'A']++;
        }
        return record['R' - 'A'] == record['L' - 'A'] && record['U' - 'A'] == record['D' - 'A'];
    }

    /**
     * 模拟
     *
     * @param moves 移动
     * @return boolean
     */
    public boolean judgeCircle3(String moves) {
        int posX = 0;
        int posY = 0;
        for (char ch : moves.toCharArray()) {
            if (ch == 'L') {
                posX -= 1;
            } else if (ch == 'R') {
                posX += 1;
            } else if (ch == 'U') {
                posY += 1;
            } else {
                posY -= 1;
            }
        }
        return posX == 0 && posY == 0;
    }

}
